SQL编程介绍
一:SQL也是一门程序设计语言!可以用其编程!
二:基本常规的编程要素
变量,运算符,表达式,流程控制,函数
变量
--
典型的,字段名就是变量名,字段就是变量!
特殊的变量,例如系统内置变量(character\_set\_xxx, autocommit)
变量的典型操作:
赋值,取得值!
### 用户自定义变量
用户自定义变量需要使用 @作为变量名的前缀,用于区分是否是系统内置变量!
set 语句可以完成对变量的设置!
set 变量名=变量值!
怎么取得?
采用select 语句即可!
编程的的实现
------
一共有三种编程方式:
触发器,存储函数(自定义函数),存储过程
函数
--
### 内置函数
对于mysql来讲,有内置函数!
rand(),生成随机数的函数,得到0-1之间的随机数
典型的为了得到某个范围内的随机数,需要\* N倍:
需要配合上取整使用,达到取得随机整数的目的:
floor()向下取整:
一到三十之间的随机数如下:
substring(字符串,位置,长度),截取字符串函数
注意,从1开始的下标!
而且是以为字符为单位:
char\_length()字符数量
length()字节长度
convert(字符串 using 字符集)字符转换到相应的目标字符集上
### 自定义函数
函数的要素:
函数名,函数体(返回值),函数参数
函数的基本使用:
声明,调用
#### 声明
注意多条语句,修改结束符
#### 调用
类似于系统函数即可!
注意,函数是存储在某个数据库内,因此与库是相关的!
#### 参数
注意,参数也是需要有类型之分
而且,[不用使用@。原因是](mailto:%E4%B8%8D%E7%94%A8%E4%BD%BF%E7%94%A8@%E3%80%82%E5%8E%9F%E5%9B%A0%E6%98%AF)函数内的变量是不用区分的!参数是一个局部变量!
#### 函数局部变量与函数外全局变量的作用域问题
作用域是重叠的!在函数内,可以访问到函数外所定义的全局变量!
#### 局部变量
在函数内的变量!
参数是!
此时在函数内,使用关键字 declare 来声明局部变量(js中类似var的作用)!
#### 流程控制
分支
if 条件 then 语句
else if 条件 then 语句
else 语句
end if;
循环
while 条件 do
循环体
end while;
示例:求1-N之和:
练习:拼凑随机的名字!
getName(2|3|4)
参数为名字的长度,而返回值为名字!
业务逻辑:
取得姓,在某个集合内获取的!
再取的名字(根据字数,取得的数量不同)。
php层面不常用
作业
==
完成以下功能:
1,数据的筛选,搜索功能
可以主动增加条件
2,列表字段排序
注意,不用考虑太多关联的问题!
3,大家试着总结,视图的创建,删除,修改的语法!
4,完成一个转账系统,练习事务
5,要求大家完成一个mysql自定义函数,可以求N的阶乘!
N! = 1\*2\*3\*4\*N;(N! = N\*(N-1)!,)
(要求,判断N不能超过30,返回结果)
(测试,是否可以用递归,先测试一个下php的递归!)
作业说明
====
搜索功能
----
result.php
形成年份列表
下拉 select
点击提交后,获得用户所填写的年份,然后对条件进行判断!
拼凑到sql语句中!
再对月份进行判断:
考虑,是否选择了月份
选择了月份,还要考虑是否选择了年份
形成,月份列表:
同理,需要对月份进行判断:
此时条件由多部分组成,考虑条件 之间的关联问题!
典型:
如果是一个字段上的条件,应该整理到一起!
增加一个名字的条件:
不是match\_time字段
典型的,如果是多个字段作为条件,会先将所有的条件,整理到一个数组内,再将数组内的元素连接起来即可!
SQL编程
=====
存储过程,procedure
--------------
与函数类型,都是一个功能模块的即可代码!
相对于函数,函数,倾向于某个功能点。
而过程,倾向于某个业务逻辑的整体实现!
功能点:自由得到用户名,函数
业务逻辑:向select\_student表内,插入1W条测试数据!,过程
### 语法
函数:create function
过程:createprocedure
创建
create procedure 过程名 (参数列表)
begin
过程体,执行代码的集合
end
注意没有返回值
调用
不能直接调用!需要使用 call 关键字调用存储过程:
过程,是一个独立的业务逻辑,不能出现在表达式内。
过程的参数
-----
功能类似函数的参数,也是在运行时传递数据。
但是,参数是分成三种类型:
### 输入,in
调用过程时,给过程传递数据,就是输入参数
### 输出,out
过程之后后,可以利用该参数,将数据传递出来!
参数 r变量的值,要输出给调用的变量。调用时,要保证,相应位置的实参,一定要是一个变量才可以!
### 输入输出,inout
同时完成输入和输出功能。既可以输入数据,也可以输出数据!
利用:in,out,inout来声明参数,最像php中引用传递!
典型,可以利用过程,增加测试数据:
1W条学生数据!
过程与函数的区别:
---------
函数有返回值,而过程没有
函数应该表达式内,而过程应该独立调用(不能出现在表达式内)!
参数上有区别,函数只有一类参数,只负责输入是参数数据!而过程,in,out,inout之分!
本质上,过程一整个业务逻辑。函数是一个特定功能点!
表的存储引擎
======
innobd,是一种mysql支持的存储引擎!
什么是存储引擎?
指的是,数据在服务器上的存储格式!
典型的mysql支持多种引擎:
不同的存储引擎意味着,存储方式的不同:
例如:innodb,与myisam:
myisam三个文件
而innodb只有一个
那数据和索引在哪里?所有innodb的表的数据和索引都是统一管理的!称之为innodb数据空间:
对于mysql,常用的,innodb和myisam!
区别:
1, 文件的分配不一致
2, 功能上将:innodb,事务安全型存储引擎,支持外键,事务等!
3, 功能上:myisam,对查询有一定的额外优化!
选择:
1, 先参考功能。
2, 在参考性能(看增删改查哪种操作多)。增加和查询较多使用myisam。更新和删除较多使用innodb。
root 密码忘了咋办
===========
将其他的 user表的三个文件,拷贝到你的mysql目录下!
更新 root 用户 Password字段即可!
面临的问题是,没密码,登陆不上,没法更新
mysqld服务器程序,有一个选项,跳过权限认证选项!客户端登陆时随便!
1, 重启开启mysqld服务。以跳过权限认证的模式!
命令行执行mysqld命令开启
2, 直接登陆不用用户名密码
3, 更新mysql.user表root用户的password字段!
4, 重新开启mysqld
![] (1F0F0655FEDD5ED35A301CED82320AC5.png)